﻿#ifndef __PROTOCOL_CUSTOM_H__
#define __PROTOCOL_CUSTOM_H__

#include "ProtocolData.h"
#include "system/Thread.h"

// 设备负载类型枚举，定义了设备中可能涉及的各种负载。
typedef enum {
    E_DEV_LOAD_TYPE_COMMON_TEMP = 0,  // 常温阀（预留阀）
    E_DEV_LOAD_TYPE_COLD_WATER,       // 冷水放水阀（热水阀）
    E_DEV_LOAD_TYPE_WATER_IN,         // 进水阀
    E_DEV_LOAD_TYPE_WASTE_WATER,      // 废水阀
    E_DEV_LOAD_TYPE_AIR_PUMP,         // 增压泵
    E_DEV_LOAD_TYPE_UV_LIGHT,         // UV灯（回水阀）->冷水放水阀
    E_DEV_LOAD_TYPE_COOLING,          // 冷却阀
	E_DEV_LOAD_TYPE_COMPRESSOR,        // 制冷220V输出 主板压缩机
    E_DEV_LOAD_TYPE_LED_LIGHT,        // 出水LED照明灯
    E_DEV_LOAD_TYPE_TDS1,             // TDS传感器1
    E_DEV_LOAD_TYPE_TDS2,             // TDS传感器2

	E_DEV_LOAD_TYPE_INTAKE_FAN,       			// 进气风扇
	E_DEV_LOAD_TYPE_CONDENSER_FAN,    	// 冷凝风扇
	E_DEV_LOAD_TYPE_CIRCULATION_PUMP, 	// 循环水泵
	E_DEV_LOAD_TYPE_ICETANK_IN,         		// 冰水箱进水阀
	E_DEV_LOAD_TYPE_DIAPHRAGM_PUMP,         // 冷水隔膜泵
    E_DEV_LOAD_TYPE_ICEMAKE_PUMP,         		//制冰泵
	E_DEV_LOAD_TYPE_HEAT_FILM,         		//发热膜
    E_DEV_LOAD_TYPE_ICE_OUT,         // 脱冰阀
	E_DEV_LOAD_TYPE_PUSH_FORWARD,	//推杆电机正
	E_DEV_LOAD_TYPE_PUSH_REVERSE,		//推杆电机负
	E_DEV_LOAD_TYPE_MAKEICE_IN,			//制冰水箱进水阀
	E_DEV_LOAD_TYPE_MOTOR_FORWARD,	//出冰电机正转
	E_DEV_LOAD_TYPE_MOTOR_REVERSE,		//出冰电机反转
	E_DEV_LOAD_TYPE_CLEANTANK2,		//净水箱2
} E_DEV_LOAD_TYPE;

SProtocolParam& getProtocolParam();

namespace protocol {

Mutex& getAckLock();

/**
 * @brief 解析协议
 * @param data 协议数据
 * @param len 数据长度
 * @param next 下一帧位置
 * @param protocol_data 解析结果
 * @return true 成功，false 失败
 */
bool parse(const uint8_t *data, uint32_t len, const uint8_t *&next, SProtocolData &protocol_data);

/**
 * @brief 发送查询协议
 * @return true 成功，false 失败
 */
bool ack();
bool ackProduct();
/**
 * @brief 开始出水
 * @param waterTemp 出水温度
 * @param waterOutput 出水流量
 * @param isUpdateWaterTemp 主板出水状态时接收到指令是否会更新当前设定出水温
 * @param mode 出水模式(普通模式和自动沸水模式)
 * @return true 成功，false 失败
 * @note 开始出水命令，发送开始出水命令
*/
bool startOutputWater(uint8_t waterTemp, uint16_t waterOutput, bool isUpdateWaterTemp = false, bool isSend = true, E_MODE mode = E_MODE::E_MODE_NORMAL);

/**
 * @brief 停止出水
 * @return true 成功，false 失败
 * @note 停止出水命令，发送停止出水命令
*/
bool stopOutputWater();

/**
 * @brief 常温阀控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 常温阀控制命令，发送控制常温阀打开或关闭命令
*/
bool setCommonTemp(bool on, bool isSend = true);

/**
 * @brief 冷水放水阀控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 冷水放水阀控制命令，发送控制冷水放水阀打开或关闭命令
*/
bool setColdWater(bool on, bool isSend = true);

/**
 * @brief 进水阀控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 进水阀控制命令，发送控制进水阀打开或关闭命令
*/
bool setWaterIn(bool on, bool isSend = true);

/**
 * @brief 废水阀控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 废水阀控制命令，发送控制废水阀打开或关闭命令
*/
bool setWasteWater(bool on, bool isSend = true);

/**
 * @brief 增压泵控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 增压泵控制命令，发送控制增压泵打开或关闭命令
*/
bool setAirPump(bool on, bool isSend = true);

/**
 * @brief UV灯控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note UV灯控制命令，发送控制UV灯打开或关闭命令
*/
bool setUVLight(bool on, bool isSend = true);

/**
 * @brief 冷却阀控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 冷却阀控制命令，发送控制冷却阀打开或关闭命令
*/
bool setCooling(bool on, bool isSend = true);

/**
 * @brief 制冷220v输出
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 制冷220v输出控制命令，发送控制制冷220v输出打开或关闭命令
*/
bool setCold220V(bool on, bool isSend = true);
bool setIceCake(bool on, bool isSend = true);

/**
 * @brief 出水LED照明灯控制
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 出水LED照明灯控制命令，发送控制LED照明灯打开或关闭命令
*/
bool ledControl(bool on, bool isSend = true);

/**
 * @brief TDS查询设置
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note TDS查询或关闭
*/
bool setTds(bool on, bool isSend = true);

/**
 * @brief 设置出水流速
 * @param speed 出水流速
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 设置出水流速开关
*/
bool setWaterSpeed(int speed, bool isSend = true);

/**
 * @brief 设置出水流速开关
 * @param on true 打开，false 关闭
 * @param isSend 是否立即发送命令
 * @return true 成功，false 失败
 * @note 设置出水流速开关
*/
bool setWaterSpeedSwitch(bool on, bool isSend = true);

/**
 * @brief 查询出水状态
 * @return true 成功，false 失败
 * @note 在回调匹配cmd为0x00信息
 */
bool queryOutputWaterStatus();

/**
 * @brief 查询加热模块信息
 * @return true 成功，false 失败
 * @note 在回调匹配cmd为0xB1信息
*/
bool queryHeatModuleInfo();

/**
 * @brief 查询负载模块信息
 * @return true 成功，false 失败
 * @note 在回调匹配cmd为0xB2信息
*/
bool queryLoadModuleInfo();

/**
 * @brief 查询水箱信息
 * @return true 成功，false 失败
 * @note 在回调匹配cmd为0xE1信息
*/
bool queryWaterBoxInfo();

/**
 * @brief 温度校正
 * @param set true 设置，false 不设置
 * @param addOrSub true 加，false 减
 * @return true 成功，false 失败
*/
bool setTempCorrection(bool set, bool addOrSub);

/**
 * @brief 沸点设置
 * @param tempMax 沸点值
 * @return true 成功，false 失败
*/
bool setWaterTempMax(uint8_t tempMax);

/**
 * @brief 常温水出水负载开关
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setCommonWaterMode(bool on);

/**
 * @brief 热水出水负载开关
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setHotWaterMode(bool on);

/**
 * @brief 冷水出水负载开关
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setColdWaterMode(bool on);

/**
 * @brief 冰胆排水
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setIceDrainWater(bool on);

/**
 * @brief 外供净水
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setWaterSupply(bool on);

/**
 * @brief 滤芯冲洗
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
*/
bool setFilterClean(bool on);

/**
 * @brief 排水
 * @param on true 打开，false 关闭
 * @return true 成功，false 失败
 */
bool setDrainWater(bool on);

/**
 * @brief 关闭所有阀门
 * @return true 成功，false 失败
 */
bool closeAllValve();

/**
 * @brief 获取对应负载开关状态
 * @param loadType 负载类型
 * @return true 打开，false 关闭
 */
bool getLoadSwitch(E_DEV_LOAD_TYPE loadType);

/**
 * @brief 设置对应负载开关状态
 * @param loadType 负载类型
 * @param on true 打开，false 关闭
 */
void setLoadSwitch(E_DEV_LOAD_TYPE loadType, bool on);

void setAA_E1();

}

#endif //__PROTOCOL_CUSTOM_H__
